package com.weic.easycache.framework.biz;

import java.sql.SQLException;

import com.j256.ormlite.dao.CloseableIterator;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.QueryBuilder;

/** 只能用于从非通用数据库表加载数据。
  * 注意，用泛型方法而不是在接口定义泛型的原因是：实现类需要与多个Task交互，而每个Task处理的实体类型都不一样。**/
public interface IDbBiz<DATA> extends IBiz<DATA> {
	
	/**
	 * 从数据库表读取数据。如果定义任务是"read"操作的话，会调用本方法。
	 * @return 返回成功还是失败的信息。如果成功则返回{@link #RESULT_OK}，失败返回{@link #RESULT_FAILURE}或自定义错误信息。
	 * 注意Task若失败将中断后面任务的执行，而没有忽略失败的选项，因为同一个Task对后面Task的影响视不同的Task列表而不同。
	 **/
	<T> String update(int taskId, CloseableIterator<T> iterator) throws SQLException;
	
	/**
	 * 如果定义任务是"write"操作的话，会调用本方法。
	 * @return 返回成功还是失败的信息。如果成功则返回{@link #RESULT_OK}，失败返回{@link #RESULT_FAILURE}或自定义错误信息。
	 **/
	<T, ID> String writeDB(int taskId, Dao<T, ID> dao) throws SQLException;
	
	/**
	 * 更新查询条件。只有定义任务是"read"操作的话，才会调用本方法。
	 * 泛型第一个参数表示要查询的实体类，第二个参数表示实体类主键类型。
	 **/
	<T, ID> void createQuery(int taskId, QueryBuilder<T, ID> queryBuilder) throws SQLException;
}
